import { Module, Global } from '@nestjs/common';
import {
  ValidationPipe,
  ParseIntPipe,
  ParseBoolPipe,
  ParseArrayPipe,
  ParseUUIDPipe,
  DefaultValuePipe,
} from '@nestjs/common';
import { ParseDiyFormPipe } from './parse-diy-form.pipe';

/**
 * 管道模块 - 基础设施层
 * 基于 NestJS 官方内置管道
 * 参考: https://docs.nestjs.cn/pipes
 * 对应 Java: @InitBinder + @Valid
 *
 * 统一管理所有验证管道，避免重复定义
 */
@Global()
@Module({
  providers: [
    // 统一的验证管道配置
    {
      provide: 'VALIDATION_PIPE',
      useValue: new ValidationPipe({
        whitelist: true, // 自动过滤掉没有装饰器的属性
        forbidNonWhitelisted: true, // 如果有非白名单属性，抛出错误
        transform: true, // 自动转换类型
        transformOptions: {
          enableImplicitConversion: true, // 启用隐式转换
        },
        validateCustomDecorators: true, // 验证自定义装饰器
        exceptionFactory: (errors) => {
          // 自定义错误格式
          const result = errors.map((error) => ({
            property: error.property,
            value: error.value,
            constraints: error.constraints,
          }));
          return new Error(JSON.stringify(result));
        },
      }),
    },
    {
      provide: 'PARSE_INT_PIPE',
      useValue: new ParseIntPipe(),
    },
    {
      provide: 'PARSE_BOOL_PIPE',
      useValue: new ParseBoolPipe(),
    },
    {
      provide: 'PARSE_ARRAY_PIPE',
      useValue: new ParseArrayPipe({ items: String, separator: ',' }),
    },
    {
      provide: 'PARSE_UUID_PIPE',
      useValue: new ParseUUIDPipe(),
    },
    {
      provide: 'DEFAULT_VALUE_PIPE',
      useValue: new DefaultValuePipe(''),
    },
    // 业务特定的自定义管道
    ParseDiyFormPipe,
  ],
  exports: [
    'VALIDATION_PIPE',
    'PARSE_INT_PIPE',
    'PARSE_BOOL_PIPE',
    'PARSE_ARRAY_PIPE',
    'PARSE_UUID_PIPE',
    'DEFAULT_VALUE_PIPE',
    // 业务特定的自定义管道
    ParseDiyFormPipe,
  ],
})
export class PipesModule {}
